﻿using pdfer.FileObjects;
using pdfer.Syntax;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace pdfer.PdfObjecs
{
    internal class TrailerDictionary //: PdfObject 尾部暂时不需要这个基类
    {
        private const String Key_Size = "/Size";
        private const String Key_Root = "/Root";
        private const String Key_Info = "/Info";
        private const String Key_ID = "/ID";
        private const String Key_Prev = "/Prev";
        private const String Key_XRefStm = "/XRefStm";
        /// <summary>
        /// Size 文件交叉引用表中的条目总数（通常等于文件中的对象数加1）
        /// Required
        /// </summary>
        public Int32 Size { get; set; }
        /// <summary>
        /// xref流的长度 不是必须
        /// </summary>
        public Int32 XRefStm { get; set; }
        /// <summary>
        /// 根对象
        /// </summary>
        public String Root { get;set; }
        /// <summary>
        /// 前一个xref表 不是必须
        /// </summary>
        public Int32 Prev { get;set; }
        /// <summary>
        /// Info 文档的文档信息字典
        /// </summary>
        public String Info { get;set; }
        /// <summary>
        /// Id   唯一标识工作流程中的文件。第一个字符串在首次创建文件时确定，第二个字符串在工作流系统修改文件时进行修改
        /// </summary>
        /// <param name="pdfFileTrailer"></param>
        public String[] Id { get;set; }

        internal static TrailerDictionary Create(Dictionary<String, Object> tobj)
        {
            var result = new TrailerDictionary();
            if (tobj.TryGetValue(Key_Size, out var val))
            {
                result.Size = PdfParserUtils.ParseInt32(val, null);
            }
            if (tobj.TryGetValue(Key_XRefStm, out val))
            {
                result.XRefStm = PdfParserUtils.ParseInt32(val, null);
            }
            if (tobj.TryGetValue(Key_Root, out val))
            {
                result.Root = PdfParserUtils.ParseString(val);
            }
            if (tobj.TryGetValue(Key_Prev, out val))
            {
                result.Prev = PdfParserUtils.ParseInt32(val, null);
            }
            if (tobj.TryGetValue(Key_Info, out val))
            {
                result.Info = PdfParserUtils.ParseString(val);
            }
            if (tobj.TryGetValue(Key_Info, out val) && val is List<Object> strs)
            {
                result.Id = strs.Select(p => p.ToString()).ToArray();
            }
            return result;
        }
    }
}
